#! /usr/bin/env bash

#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

#
# Basic regression test script.
#
# Verify that the source tree builds and that out of tree builds work. We don't use root for any of this because
# it should not be required (that would be a bug). Then run the automake regression tests and the traffic_server
# regression tests.
#

set -e # exit on error

TMPDIR=${TMPDIR:-/tmp}
BUILDID="org.apache.trafficserver.$$"

SRCROOT=${SRCROOT:-$(cd $(dirname $0)/.. && pwd)} # where the source lives
OBJROOT=${OBJROOT:-"$TMPDIR/$BUILDID/obj"} # where we are building
DSTROOT=${DSTROOT:-"$TMPDIR/$BUILDID/dst"} # where we are installing

# Force low make parallelization so that the build can complete in a VM with
# only a small amount of memory.
NPROCS=${NPROCS:-2}

mkdir -p $SRCROOT
mkdir -p $OBJROOT
mkdir -p $DSTROOT

prog() {
  case $1 in
    cc)
      case $(uname -v) in
        Darwin*) echo clang ;;
        omnios*) echo /opt/gcc-4.6.3/bin/gcc ;;
        *) echo cc ;;
      esac
      ;;
    cxx)
      case $(uname -v) in
        Darwin*) echo clang++ ;;
        omnios*) echo /opt/gcc-4.6.3/bin/g++ ;;
        *) echo c++ ;;
      esac
      ;;
    make)
      case $(uname) in
        FreeBSD) echo gmake ;;
        *) echo make ;;
      esac
      ;;
  esac
}

extras() {
  case $(uname -v) in
    Darwin*) echo --with-openssl=$(brew --prefix openssl) ;;
  esac
}

autogen() {
  (
    cd "$SRCROOT"
    [ configure -nt configure.ac -a Makefile.in -nt Makefile.am ] || autoreconf -fi
  )
}

configure() {
  (
    cd $OBJROOT
    $SRCROOT/configure \
      --prefix=$DSTROOT \
      --enable-debug \
      --enable-werror \
      --enable-example-plugins \
      --enable-test-tools \
      --enable-experimental-plugins \
      $(extras) \
      CC="$CC" \
      CXX="$CXX" \
      "$@"
  )
}

build() {
  ( cd $OBJROOT && $MAKE -j $NPROCS )
  ( cd $OBJROOT && $MAKE install )
}

# Run extended (level 3) regressions.
regress() {
  ( cd $OBJROOT && $MAKE check ) && \
  $DSTROOT/bin/traffic_server -k -K -R 1 && \
  $SRCROOT/tests/autest.sh --ats-bin=$DSTROOT/bin
}

CC=${CC:-$(prog cc)}
CXX=${CXX:-$(prog cxx)}
MAKE=${MAKE:-$(prog make)}
export CC CXX MAKE

autogen
configure "$@"
build
regress
